package es.uned.ii.si3.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import es.uned.ii.si3.model.Mensaje;
import es.uned.ii.si3.model.Usuario;

public class MensajeDAOImpl implements MensajeDAO {

	
	public MensajeDAOImpl() {
		
	}
	
	
	public List<Mensaje> getAll(int idUsuario) {
		
		Connection conn = ConnectionFactory.getConnection();
		List<Mensaje> listaMensajes = new ArrayList<Mensaje>();
		PreparedStatement ptmt = null;
		ResultSet resultado = null;
		
		try {
			ptmt = conn.prepareStatement("SELECT * FROM mensajes WHERE idDestinatario = ? ORDER BY fechaEnvio DESC;");
			ptmt.setInt(1, idUsuario);
			resultado = ptmt.executeQuery();
			
			while (resultado.next()){
				Mensaje mensaje = new Mensaje();
				mensaje.setIdMensaje(resultado.getInt("idMensaje"));
				mensaje.setAsunto(resultado.getString("asunto"));
				mensaje.setMensaje(resultado.getString("mensaje"));
				mensaje.setFechaEnvio(resultado.getTimestamp("fechaEnvio"));
				mensaje.setLeido(resultado.getBoolean("leido"));

				Usuario destinatario = new Usuario();
				destinatario.setIdUsuario(resultado.getInt("idDestinatario"));
				mensaje.setDestinatario(destinatario);
				
				listaMensajes.add(mensaje);
			}
		} catch (SQLException e) {
			listaMensajes = null;
		} finally {
			try {
				resultado.close();
				resultado = null;
			} catch (Exception e) { }
			
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		ConnectionFactory.release(conn);
		return listaMensajes;
	}
	


	public Mensaje get(int idMensaje) {
		
		Connection conn = ConnectionFactory.getConnection();
		Mensaje mensaje = null;
		PreparedStatement ptmt = null;
		ResultSet resultado = null;
		
		try {
			ptmt = conn.prepareStatement("SELECT * FROM mensajes WHERE idMensaje = ?;");
			ptmt.setInt(1, idMensaje);
			resultado = ptmt.executeQuery();
			
			if (resultado.next()){
				mensaje = new Mensaje();
				mensaje.setIdMensaje(resultado.getInt("idMensaje"));
				mensaje.setAsunto(resultado.getString("asunto"));
				mensaje.setMensaje(resultado.getString("mensaje"));
				mensaje.setFechaEnvio(resultado.getTimestamp("fechaEnvio"));
				mensaje.setLeido(resultado.getBoolean("leido"));

				Usuario destinatario = new Usuario();
				destinatario.setIdUsuario(resultado.getInt("idDestinatario"));
				mensaje.setDestinatario(destinatario);
			}
		} catch (SQLException e) {
			mensaje = null;
		} finally {
			try {
				resultado.close();
				resultado = null;
			} catch (Exception e) { }
			
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		ConnectionFactory.release(conn);
		return mensaje;
	}

	

	public boolean insert(Mensaje mensaje) {
		
		Connection conn = ConnectionFactory.getConnection();
		PreparedStatement ptmt = null;
		boolean insertOK = false;
		
		try {
			ptmt = conn.prepareStatement("INSERT INTO mensajes(idDestinatario, asunto, mensaje, fechaEnvio, leido) VALUES(?, ?, ?, ?, ?);");
			ptmt.setInt(1, mensaje.getDestinatario().getIdUsuario());
			ptmt.setString(2, mensaje.getAsunto());
			ptmt.setString(3, mensaje.getMensaje());
			ptmt.setTimestamp(4, new java.sql.Timestamp(mensaje.getFechaEnvio().getTime()));
			ptmt.setBoolean(5, mensaje.isLeido());
			insertOK = ptmt.executeUpdate() > 0;
		} catch (SQLException e) {
			insertOK = false;
		} finally {
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		ConnectionFactory.release(conn);
		return insertOK;
	}

	

	public boolean update(Mensaje mensaje) {
		
		Connection conn = ConnectionFactory.getConnection();
		PreparedStatement ptmt = null;
		boolean updateOK = false;
		
		try {
			ptmt = conn.prepareStatement("UPDATE mensajes SET idDestinatario=?, asunto=?, mensaje=?, fechaEnvio=?, leido=? WHERE idMensaje=?;");			
			ptmt.setInt(1, mensaje.getDestinatario().getIdUsuario());
			ptmt.setString(2, mensaje.getAsunto());
			ptmt.setString(3, mensaje.getMensaje());
			ptmt.setTimestamp(4, new java.sql.Timestamp(mensaje.getFechaEnvio().getTime()));
			ptmt.setBoolean(5, mensaje.isLeido());
			ptmt.setInt(6, mensaje.getIdMensaje());
			updateOK = ptmt.executeUpdate() > 0;
		} catch (SQLException e) {
			updateOK = false;
		} finally {
			try {
				ptmt.close();
				ptmt = null; 
			} catch (Exception e) { }
		}
		ConnectionFactory.release(conn);
		return updateOK;
	}

}
